﻿#ifndef CX_DEFINE_H
#define CX_DEFINE_H
#include <stdint.h>

//windows
#if (defined(_WIN32) || defined(_WIN64)) 
#include <windows.h> 
#define CALLBACK __stdcall
//linux
#elif defined(__linux__) || defined(__APPLE__)
#define CALLBACK  
#ifdef __OBJC__
#include "objc/objc.h"
#endif
#else
#error "Unsupported platform"
#endif

//宏定义
#define MAX_SLOT_COUNT 32
#define MAX_RANGE_COUNT 64
#define BUFFER_FOR_PARSE 8*1024*1024

// 用户设备handle
typedef void* CxDeviceHandle;
typedef void* PXIeCard_DeviceHandle;

/// <summary>
/// 设备信息
/// </summary>
typedef struct
{
	uint32_t ScanCardIndex;
	uint32_t SlotID;
	uint32_t VendorId;
	uint32_t DeviceId;
	uint32_t SubDeviceId;
	uint32_t FirmwareVersion;
	bool	 IsStreamMode;
	uint32_t ChannelCount;
	uint32_t RangeCount;                 // 量程数
	uint32_t RangeList[MAX_RANGE_COUNT]; // 量程列表，单位mV
}CardInfo;

typedef enum
{
	/********元器件电路配置********/
	ClockSource = 0x1,	// 时钟源
	CouplingMode = 0xB,	// 耦合方式：直流、交流
	InputImpedance = 0xC,	// 输入阻抗，单位欧姆
	PreamplifierGain = 0xD,	// 前放增益
	SignalEnable = 0xE,	// 信号输入使能
	VoltageOffset = 0x18,	// 偏置电压，单位mV
	VGAGain = 0x1B,	// VGA增益
	VoltageRange = 0x42,	// 电压量程，单位mV
	CurrentRange = 0x43,	// 电流量程，单位mA

	/********触发相关********/
	TrigSource = 0x2,	// 触发源
	FiniteTrigNum = 0x35,	// 有限次触发次数
	AutoTrigPeriod = 0x36,	// 通道自触发周期，单位ns
	TrigMode = 0x3,	// 触发模式
	TrigPolarity = 0x4,	// 触发极性
	TrigLevel = 0x5,	// 触发电平，单位mV
	ExternalTrigPolarity = 0x6,	// 外触发极性
	TrigPosition = 0x7,	// 触发位置，单位ns
	TrigLength = 0x8,	// 触发长度，单位ns
	TrigPulseWidth = 0x9,	// 触发脉宽，单位ns
	ExternalTrigLevel = 0x1C,	// 外部触发阈值，单位mV
	MultiTrigEnable = 0x27,	// 多重触发使能（触发内的触发）
	TrigPoints = 0x44, // 触发点数
	SoftwareTrig = 0x100000, //软触发
	FrameAddNumber = 0x45, // 累加次数
	FrameAddEnable = 0x46, // 累加使能

	/********恒比定时PSD等业务********/
	CFDLatency = 0x11,	// 恒比定时延迟
	CFDAttenuation = 0x12,	// 恒比定时衰减
	GateOffset = 0x13,	// 门偏置，单位ns
	ShortGate = 0x14,	// 短门，单位ns
	LongGate = 0x15,	// 长门，单位ns
	GateOffsetMode = 0x16,	// 门偏置模式

	/********触发窗口同步和选择********/
	SyncWindowEnable = 0x22, // 同步开窗使能（同步采集开窗，多通道采集用，时间计数重新刷新，从0开始）
	SyncWindowLength = 0x23,	// 同步开窗长度，单位ns
	SyncSource = 0x2D, // 同步源
	SyncPosition = 0x30,	// 开窗的位置，单位ns
	TrigWindowStart = 0x25,	// 触发窗口开始，单位ns（每个通道符合开窗范围，通道用户自定义，相对于SyncWindow的0点）
	TrigWindowEnd = 0x26,	// 触发窗口结束，单位ns（相对于SyncWindow的0点）
	GlobalTrigEnable = 0x47, // 全局触发使能
	GlobalTrigDisable = 0x48, // 全局触发失能
	GlobalTrigMode = 0x49, // 全局触发与或逻辑，1表示与逻辑，0表示或逻辑

	/********基线跟踪********/
	TrigBaselineMode = 0x21,	// 基线模式
	TraceBaselineWindow = 0x24,	// 基线跟踪长度，单位ns
	TraceBaselineBeforeTrig = 0x28,	// 基线跟踪前置偏移，单位ns
	FixedBaseLineLevel = 0x29,	// 固定基线阈值，单位mV

	RawDataEnable = 0xF,	// 波形数据使能

	/********定制化确认********/
	TimeNHitThreshold = 0x2A, // 设置TCM数字触发匹配窗
	TimeTrigWindow = 0x2B, // 设置TCM总数字触发参数
	TimeT0FrequencyDown = 0x2C, // 设置T0降频参数
	T0Mode = 0x2E, // 设置T0信号来源
	T0FakeCycle = 0x2F, // 设置模拟T0产生频次
	T0MeasureEnable = 0x31, // 设置T0_measure使能
	LoadTemperature1Data = 0x40, // 读取温度传感器1数值，单位为0.01摄氏度
	LoadTemperature2Data = 0x41, // 读取温度传感器2数值，单位为0.01摄氏度
	BoardFitIPChannelAcquisition = 0x0E000, // 本地板卡触发获取通道
	BoardFitIPChannelAntiAcquisition = 0x0E004, // 本地板卡触发反符合通道
	BoardFitIPAntiAcquisitionWindowBefore = 0x0E008, // 本地板卡触发前反符合时间，单位ns
	BoardFitIPAntiAcquisitionWindow = 0x0E00C, // 本地板卡触发后反符合时间，单位ns

	/********临时********/
	TCMSoftTrig = 0x100001,
	CardSynMode = 0x100002,
	TCMTrigEnable = 0x100003,
	TCMTrigSourceSel = 0x100004,
}CONFIG_ID;

//采集数据包
/// <summary>
/// 科学数据包
/// </summary>
typedef struct
{
	// stable
	/// <summary>
	/// 包类型
	/// </summary>
	uint8_t PackType;

	/// <summary>
	/// 板载类型
	/// </summary>
	uint32_t BoardType;

	/// <summary>
	/// 采样频率
	/// </summary>
	uint16_t SampleFrequenceMHz;

	/// <summary>
	/// 采样分辨率
	/// </summary>
	uint8_t Resolution;

	/// <summary>
	/// 通道号
	/// </summary>
	uint16_t ChannelId;

	/// <summary>
	/// 槽位号
	/// </summary>
	uint8_t SlotId;

	/// <summary>
	/// 固件版本
	/// </summary>
	//uint32_t FirmwareVersion;

	// var change 
	/// <summary>
	/// 触发号
	/// </summary>
	uint32_t TriggerId;

	/// <summary>
	/// 秒数，相对于utc的时间
	/// </summary>
	uint64_t TimestampSecond;

	/// <summary>
	/// 时间-纳秒，秒以下的计量
	/// </summary>
	uint32_t TimestampNanosecond;

	/// <summary>
	/// 8bit 补偿精细时间戳，单位根据板卡型号有所区别，例60ps
	/// </summary>
	uint8_t TimestampFine;

	/// <summary>
	/// 波形码值偏移
	/// </summary>
	int32_t ADCDigitOffset;

	/// <summary>
	/// 波形增益
	/// </summary>
	double ADCPreGain;

	/// <summary>
	/// 量程 mv
	/// </summary>
	int32_t ADCRange;

	/// <summary>
	/// ADC 精度位数
	/// </summary>
	uint8_t ADCPrecision;

	/// <summary>
	/// 波形解析方式
	/// 0 - WaveData 中连续两字节大端，
	/// 1 - 连续两字节小端， 
	/// ......
	/// 一个点的实际电压 mv = （WaveData 一个解码点 - ADCDigitOffset）* ADCRange * ADCPregain / (1 << ADCPrecision)
	/// </summary>
	uint8_t DecodeMode;

	/// <summary>
	/// 波形数据
	/// 由SDK 维护的内存，
	/// 请尽快copy走本块内存，然后处理
	/// </summary>
	char* WaveData;

	/// <summary>
	/// 波形数据长度
	/// </summary>
	int32_t WaveDataSize;
}SciAcqPackage;

/// <summary>
/// 一个包到达的回调
/// </summary>
typedef void (CALLBACK* OnePackComeCallback)(SciAcqPackage* package);

//日志类型
typedef enum
{
	Trace = 0,
	Debug,
	Info,
	Warn,
	Error,
	Fatal
}CxLogLevel;

/// <summary>
/// 日志回调
/// </summary>
typedef void (CALLBACK* LogCallback)(uint32_t level, const char* data);

//总线类型
enum CxBusType
{
	PCIe = 0,
	PXIe,
	PXIeV2,
	MiuXIPCIe
};

//SDK初始化选项
typedef struct
{
	bool		WithLog;
	CxLogLevel	LogLevel;
	LogCallback LogCallbackFunc;
	CxBusType	BusType;
}CxSDKInitOptions;

//卡初始化选项参数
typedef struct
{
	int32_t	SyncMode;
}CxCardInitOptions;

//时钟源选项
typedef enum
{
	OnBoardClock = 0, // 板载时钟
	DSTARAClock = 1, // 背板时钟
	ExternalClock = 2,  // 外部时钟
	ExternalClock100M = 3  // 外部时钟100M
}ClockSourceEnum;

//触发源选项
typedef enum
{
	LocalChannel = 0b1, // 本地通道
	LocalBoard = 0b10, // 本地板卡
	Global = 0b100, // 全局触发
	External = 0b1000, // 外部触发
	Force = 0b10000, // 强制触发
	Cycle = 0b100000  // 周期触发
}TriggerSourceEnum;

//触发模式选项
typedef enum
{
	Finite = 0b1, // 有限
	Normal = 0b10, // 普通
	AutoMode = 0b100  // 自动
}TriggerModeEnum;

//触发极性选项
typedef enum
{
	Falling = 0, // 下降沿
	Rising = 1  // 上升沿
}TriggerPolarityEnum;

//耦合方式选项
typedef enum
{
	ACCoupling = 0, // 交流耦合
	DCCoupling = 1  // 直流耦合
}CouplingModeEnum;

//输入阻抗选项
typedef enum
{
	Load50 = 0, // 50欧姆
	Load1M = 1  // 1兆欧姆
}InputImpedanceEnum;

//基线模式选项
typedef enum
{
	Fixed = 0, // 固定
	TraceB = 1  // 自动调节
}BaselineModeEnum;
#endif